#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include<time.h>

int main()
{
  srand(time(0));

  pid_t id = fork();
  assert(id != -1);
  if(id == 0)
  {
    //child
    int cnt = 5;
    while(cnt != 0)
    {
      printf("child pid:%d ppid:%d ret:%d\n", getpid(), getppid(), cnt--);
      sleep(1);
    }
    int num = rand()%3;
    
    //退出信号表示assert，退出码无意义
    if(num == 0)
    {
      int i = 0; 
      assert(i != 0);
    }
    else if(num == 1) //退出信号表示为除0，退出码无意义
    {
      int i = 1;
      i/=0;
    }
    //正常退出
    exit(2);
  }
  
  int status=0;
  // 1.让操作系统释放子进程的僵尸状态
  // 2.获取子进程的退出结果（退出信号和退出码）
  // 父亲进程在等待子进程的时候，处于阻塞状态
  int ret = waitpid(id, &status, 0);
  if(ret > 0)
  {
    //判断退出是否正常
    if(WIFEXITED(status))
    {
      //判断退出码正常，即子进程退出的结果是否ok
      printf("exit_code:%d\n",WEXITSTATUS(status));
    }
    else 
    {
      printf("child exit not normal!!\n"); 
    }

    //if(WIFSIGNALED(status))
    printf("wait success!child pid:%d  exit_signal:%d  exit_code:%d\n", ret, (status & 0x7F),((status>>8) & 0xFF));
    // ff 1111 1111
    // 7f 0111 1111
  }
  return 0;
}
